package api

import (
	"net/http"
	"strconv"

	"github.com/gin-gonic/gin"

	"ppp/internal/models"
	"ppp/internal/services"
)

// UserHandler 用户处理器
type UserHandler struct {
	userService services.UserService
}

// NewUserHandler 创建新的用户处理器
func NewUserHandler() *UserHandler {
	return &UserHandler{
		userService: services.NewUserService(),
	}
}

// RegisterRoutes 注册用户相关路由
func (h *UserHandler) RegisterRoutes(router *gin.Engine) {
	userGroup := router.Group("/api/users")
	{
		userGroup.POST("", h.CreateUser)       // 创建用户
		userGroup.GET("", h.ListUsers)         // 获取用户列表
		userGroup.GET("/:id", h.GetUser)       // 获取用户详情
		userGroup.PUT("/:id", h.UpdateUser)    // 更新用户信息
		userGroup.DELETE("/:id", h.DeleteUser) // 删除用户
	}
}

// CreateUser 创建用户
func (h *UserHandler) CreateUser(c *gin.Context) {
	var req models.CreateUserRequest

	// 绑定请求体
	if err := c.ShouldBindJSON(&req); err != nil {
		ValidationError(c, err.Error())
		return
	}

	// 通过服务层创建用户
	user, err := h.userService.CreateUser(&req)
	if err != nil {
		InternalServerError(c, "创建用户失败: "+err.Error())
		return
	}

	// 返回成功响应
	Created(c, user.ToResponse())
}

// GetUser 获取用户详情
func (h *UserHandler) GetUser(c *gin.Context) {
	// 获取路径参数并转换为uint
	idStr := c.Param("id")
	id, err := strconv.ParseUint(idStr, 10, 32)
	if err != nil {
		BadRequest(c, "无效的用户ID")
		return
	}

	// 通过服务层获取用户
	user, err := h.userService.GetUserByID(uint(id))
	if err != nil {
		if err.Error() == "用户不存在" {
			NotFound(c, "用户不存在")
		} else {
			InternalServerError(c, "查询用户失败: "+err.Error())
		}
		return
	}

	// 返回成功响应
	Success(c, user.ToResponse())
}

// UpdateUser 更新用户信息
func (h *UserHandler) UpdateUser(c *gin.Context) {
	// 获取路径参数并转换为uint
	idStr := c.Param("id")
	id, err := strconv.ParseUint(idStr, 10, 32)
	if err != nil {
		BadRequest(c, "无效的用户ID")
		return
	}

	var req models.UpdateUserRequest
	// 绑定请求体
	if err := c.ShouldBindJSON(&req); err != nil {
		ValidationError(c, err.Error())
		return
	}

	// 通过服务层更新用户
	user, err := h.userService.UpdateUser(uint(id), &req)
	if err != nil {
		if err.Error() == "用户不存在" {
			NotFound(c, "用户不存在")
		} else {
			InternalServerError(c, "更新用户失败: "+err.Error())
		}
		return
	}

	// 返回成功响应
	Success(c, user.ToResponse())
}

// DeleteUser 删除用户
func (h *UserHandler) DeleteUser(c *gin.Context) {
	// 获取路径参数并转换为uint
	idStr := c.Param("id")
	id, err := strconv.ParseUint(idStr, 10, 32)
	if err != nil {
		BadRequest(c, "无效的用户ID")
		return
	}

	// 通过服务层删除用户
	err = h.userService.DeleteUser(uint(id))
	if err != nil {
		if err.Error() == "用户不存在" {
			NotFound(c, "用户不存在")
		} else {
			InternalServerError(c, "删除用户失败: "+err.Error())
		}
		return
	}

	// 返回成功响应
	SuccessWithMessage(c, "用户删除成功", gin.H{"success": true})
}

// ListUsers 获取用户列表
func (h *UserHandler) ListUsers(c *gin.Context) {
	// 通过服务层获取用户列表
	users, err := h.userService.ListUsers()
	if err != nil {
		InternalServerError(c, "查询用户列表失败: "+err.Error())
		return
	}

	// 转换为响应格式
	responses := make([]*models.UserResponse, 0, len(users))
	for _, user := range users {
		responses = append(responses, user.ToResponse())
	}

	// 返回成功响应
	Success(c, responses)
}

// Login 用户登录 - 根据需求文档，这里只是一个示例接口
func (h *UserHandler) Login(c *gin.Context) {
	// 由于用户模型中没有用户名和密码字段，这个接口仅供参考
	c.JSON(http.StatusNotImplemented, gin.H{
		"error": "登录功能暂未实现，用户模型中不包含登录凭证字段",
	})
}
